

#include "Log.hpp"
#include "Listener.hpp"
#include "HandlerConn.hpp"
#include "Reactor.hpp"
#include "PackageParse.hpp"
#include <iostream>
#include <memory>

using namespace log_ns;

int main(int argc, char* argv[])
{
    if (argc != 2)
    {
        std::cerr << "Usage: " << argv[0] << " Local-Port" << std::endl;
        exit(0);
    }
    in_port_t port = std::stoi(argv[1]);

    EnableScreen();

    InetAddr localaddr("0.0.0.0", port);

    // 业务处理模块 
    PackageParse parse;

    // 专门处理新连接的到来（连接管理器） 
    Listener listener(port);

    // 专门用来处理普通 sockfd 的模块（IO 处理器） 
    HandlerConnection handlers(std::bind(&PackageParse::Execute, &parse, std::placeholders::_1));

    // 主模块，用于事件派发（事件派发器） 
    std::unique_ptr<Reactor> R = std::make_unique<Reactor>();
    
    // 模块之间产生关联 
    // 设置连接管理方法 
    R->SetOnNewConnection(std::bind(&Listener::Accepter, &listener, std::placeholders::_1));
    // 设置 IO 处理方法 
    R->SetOnNormalHandler(
        std::bind(&HandlerConnection::HandlerRecver, &handlers, std::placeholders::_1), 
        std::bind(&HandlerConnection::HandlerSender, &handlers, std::placeholders::_1), 
        std::bind(&HandlerConnection::HandlerExcepter, &handlers, std::placeholders::_1)
    );

    // 添加 Listen socket
    R->AddConnection(listener.GetSockfd(), EPOLLIN | EPOLLET, localaddr, ListenConnection);

    // 事件派发 
    R->Dispatcher();

    return 0;
}